package com.hospital.hms.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.StpUtil;
import cn.felord.payment.wechat.v3.model.payscore.UserServiceOrderParams;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.hospital.hms.common.CommonResult;
import com.hospital.hms.controller.form.LoginForm;
import com.hospital.hms.controller.form.UpdateUserPasswordForm;
import com.hospital.hms.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import static com.hospital.hms.common.CommonResult.RETURN_RESULT;

@RestController
@RequestMapping("/user")
@Tag(name = "UserController", description = "用户管理接口")
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/login")
    @Operation(summary = "用户登录")
    public CommonResult userLogin(@Valid @RequestBody LoginForm loginForm) {
        HashMap hashMap = JSONUtil.parse(loginForm).toBean(HashMap.class);
        Integer userId = userService.login(hashMap);
        // 使用 CommonResult 构建返回结果
        CommonResult result = CommonResult.ok();

        // 登录成功或失败的处理
        if (userId != null) {
            // 登录成功，设置 token 并返回给客户端
            StpUtil.login(userId); // 使用 Sa-Token 生成登录凭证并保存到 Redis

            // 获取生成的 token 和 tokenName
            String token = StpUtil.getTokenValue();
            String tokenName = StpUtil.getTokenName();

            // 查询该用户的权限信息集合
            Set<String> privileges = userService.selectUserPrivileges(userId);

            // 将权限和 token 信息加入到返回结果中
            result.put("result", "登录成功");
            result.put("permissions", privileges);
            result.put("token", token);
            result.put("tokenName", tokenName);
            // 使用日志记录重要的操作
            log.info("User logged in: userId={}, token={}, tokenName={}", userId, token, tokenName);
        } else {
            // 登录失败，返回相应的信息
            result.put(CommonResult.RETURN_RESULT, "登录失败");
        }
        return result;
    }
    @PostMapping("/logout")
    @SaCheckLogin//检查用户是否登录
    @Operation(summary = "用户退出登录")
    public CommonResult logout(){
        //删除token消息
        StpUtil.logout();
        return CommonResult.ok();
    }
    @PostMapping("/updatePassword")
    @SaCheckLogin
    @Operation(summary = "修改用户密码")
    public CommonResult updateUserPassword(@Valid @RequestBody UpdateUserPasswordForm form){

        Map<String, Object> map = BeanUtil.beanToMap(form);
        int userId = StpUtil.getLoginIdAsInt();
        map.put("uerId",userId);
        int row = userService.updateUserPassword(map);
        return CommonResult.ok().put(RETURN_RESULT,row);


    }
}
